#pragma once
#include "FAQ.h"
#include "util/MemoryFIFOBuffer.hpp"

namespace yzrilyzr_crypto{
	EBCLASS(FAQBaseCipher){
	public:
	static constexpr int ENCRYPT_MODE=1;
	static constexpr int DECRYPT_MODE=2;
	protected:
	yzrilyzr_util::MemoryFIFOBuffer<int8_t> inBuffer;
	yzrilyzr_util::MemoryFIFOBuffer<int8_t> outBuffer;
	virtual void onUpdate()=0;
	public:
	void update(const yzrilyzr_array::ByteArray & str){
		update(str, 0, str.length);
	}
	void update(const yzrilyzr_array::ByteArray & str, u_index off, u_index len){
		inBuffer.write(str, off, len);
		onUpdate();
	}
	yzrilyzr_array::ByteArray doFinal(const yzrilyzr_array::ByteArray & str){
		update(str, 0, str.length);
		doFinal();
		return outBuffer.toArray();
	}
	virtual void doFinal()=0;
	yzrilyzr_util::MemoryFIFOBuffer<int8_t> & getOutBuffer(){
		return outBuffer;
	}
	virtual void reset()=0;
	virtual u_index getBlockSize()const=0;
	};
}